home *** CD-ROM | disk | FTP | other *** search
- *cX PROGRAMACIO 3D
- *c^
- Hola! me llamo Skynet y en principio, voy a
- comenzar una especie de curso de scene (ver
- articulo de demoscene) donde voy a explicar
- las bases y los fundamentos de la programa-
- cion 3D. Este apartado puede que sea mas ade-
- lante explicado por Navi Dj. o Líyak si tu-
- bieran esa intencion...
-
- La programacion 3D es importante...es
- bonita...es la ostia...Bueno, pero todo eso
- cada uno lo sabe, aqui vamos a lo PURO Y
- DURO: Programacion 3D.
-
- Antes de seguir, hemos de decir que utiliza-
- remos la libreria Graph 2.0 y la razon es que
- ademas de ser gratis, tiene la mayoria de or-
- denes que utilizaremos y ademas, al estar en
- ASM, esto nos liberara de la carga de apren-
- der ASM y nos sera un factor para incrementar
- la velocidad. En caso de que no funcione po-
- deis tener un "Hot line" con su autor. {8-#
- La libreria que mas utilizare es la de
- PASCAL. Y como tengo algo de experiencia en
- el uso, os dire que el archivo que os pide
- la TPU *cAGRFLIB.OBJ*c^ debereis especificarlo en
- el archivo *cAGRFLIB.PAS*c^, Este ya esta especifi-
- cado con la forma *cA{$L path\GRFLIB.OBJ}*c^ y
- debereis habilitar el path, donde hayais gra-
- vado la libreria. Despues compilais la unidad
- a disco y la copiais en el directorio TPU del
- pascal (UNITS o TPU por defecto).
- Despues en cada programa que querais incor-
- porarla, solo tendreis que escribir
- *c Uses xxx,xxx,Grflib;
- *cH
- LET'S GO WITH 3D!!!
- *c^
- En principio, nos damos cuenta que el moni-
- tor solo tiene pantalla 2D, aqui esta el
- principal problema! :) Por tanto, utilizando
- algoritmos adecuados podremos suplir esa ca-
- rencia. Como crear un punto es facil:
- *cAPONPIXEL(X,Y,COLOR,PANTALLA)*c^ (O fPONPIXEL)
- *cH X-> *cOCoordenada X de 0 a 65536 (Word)
- *cH Y-> *cOCoordenada Y de 0 a 65536 (Word)
- *cH Color -> *cOColor del punto de 0 a 255 (Byte)
- *cHPANTALLA -> *cOde 0 a 255 (Byte) La pantalla es
- el lugar donde dibujaremos el pixel,
- si PANTALLA=0 entonces la mostrara en
- pantalla, pero si PANTALLA es asigna-
- cion de la orden CREAVIRTUAL.
- .
- *cK PANTALLA:=CREAVIRTUAL;
- (** Asigna memoria para la creacion de una
- pantalla virtual que tendra su propio
- codigo devuelto en la variable pantalla **)
- *c^
- Lo "dificil" sera pasar un punto (X,Y,Z) a
- (X',Y'), pues la forma de transformar es muy
- facil, ademas de incorporar una variable
- llamada *c D*c^ (Distancia) que sera la distancia
- respecto a nosotros:
- *cH
- X_2D:=(D*X_3D)/Z_3D;
- Y_2D:=(D*Y_3D)/Z_3D;
- *c^
- Mi experiencia personal me ha enseñado que
- esto es bastante inutil con el uso de las
- matrices, ya que si realizo las operaciones
- con matrizes 3D el dibujo con X e Y es simi-
- lar al de la tranformacion 3D. Pero no lo es
- en el uso de camaras 3D dirigidas o rotacio-
- nes de camaras.
- *cj
- EJEMPLO DE USO:*cv Archivo Stars.Pas
- *cK (Es el tipico ejemplo...lo siento..)
- *c^
- Una vez sabemos representar un punto en tres
- dimensiones en la pantalla, lo siguiente es
- saber modificarlo, ya que los puntos en 3D
- nos pueden servir como el esqueleto de verti-
- ces de un objeto complejo.
- Las modificaciones basicas que se pueden
- hacer son las siguientes:
- *cH
- ** Rotacion en uno de sus ejes de la
- estructura de puntos
- ** Rotacion multiple de sus ejes
- ** Transladar el objeto
- ** Escalar el objeto
- ** Invertirlo
- *c^
- Para cada opcion, existen algunas operacio-
- nes con matrices que realizan la operacion
- deseada. Estas matrices son correctas y po-
- deis consultar mas sobre este tipo de matema-
- ticas en libros de geometria analitica, alge-
- bra lineal, trigonometria y similares...
- (APRENDEDLO SOLO SI OS GUSTA!!! ya que el
- estudio obligado, es el peor castigo :) )
-
- Como deciamos, no vamos a demostrar el porque
- de esos resultados, solo mostraremos la for-
- mula de las matrices, ya que su implementa-
- cion es muy facil ademas de ser muy rapida.
- *cH
- Translacion: (sintaxis del mathlab)
- [1 0 0 0;
- 0 1 0 0;
- 0 0 1 0;
- a b c 1]
-
- Donde a=-p(cos(q)*sin(w))
- b=-p(sin(q)*sin(w))
- c=-p(cos(w))
-
- i donde p=Raiz(x^2+y^2+z^2)
- q=arctan(x/y)
- w=arccos(z/p)
- *c^
- FANTASTICO!! Con solo una operacion, obtene-
- mos una translacion con cordenadas esfericas,
- donde solo tendremos que introducir los
- datos.
- *cH
- Rotacion:
- Eje Y:
- [ a 0 b; Donde a=cos(Angulo de rotacion Y)
- 0 1 0; b=sin(Angulo de rotacion Y)
- -b 0 a]
-
- Eje Z:
- [ 1 0 0; Donde a=cos(Angulo de rotacion Z)
- 0 a -b; b=sin(Angulo de rotacion Z)
- 0 b a]
-
- Eje X:
- [ a -b 0; Donde a=cos(Angulo de rotacion X)
- b a 0; b=sin(Angulo de rotacion Y)
- 0 0 1]
- *c^
- Una vez tenemos las principales herramientas
- 3D, unicamente falta aplicarlas y como todos
- estais en la UNIVERSIDAD (¿?), se supone que
- sabreis despejarlas, para obtener la rota-
- cion... QUE NO SABEIS???!??!!?!?!?? ;-)
- Luego dicen que la selectividad es dura...
-
- En uno de los programas realizados, la
- rotacion la he implementadp con los siguien-
- tes procedimientos. Para reutilitzarlos,
- unicamente, deberas canviar la estructura de
- los parametros del procedure...
- *cH
- COST =0.999847695156391239157;
- SINT =0.017452406437283512819;
- {Para acelerar el calculo}
- Procedure Rotx(var Dades:Array of TresD);
- Var i : integer;
- Begin
- for i := 0 to MAXVERTEX do
- begin
- dades[i].y := dades[i].y ** COST +
- dades[i].z ** SINT;
- dades[i].z :=-dades[i].y ** SINT +
- dades[i].z ** COST;
- end;
- End;
-
- Procedure Roty(var dades:Array of TresD);
- Var i : integer;
- Begin
- For i := 0 to MAXVERTEX do
- Begin
- dades[i].x := dades[i].x ** COST -
- dades[i].z ** SINT;
- dades[i].z := dades[i].x ** SINT +
- dades[i].z ** COST;
- End;
- End;
-
- Procedure Rotz(var dades:Array of TresD);
- Var i : integer;
- Begin
- For i := 0 to MAXVERTEX do
- Begin
- dades[i].x := dades[i].x ** COST +
- dades[i].y ** SINT;
- dades[i].y :=-dades[i].x ** SINT +
- dades[i].y ** COST;
- End;
- End;
- *c^
- EJEMPLO SKYNET.PAS Como veis, este sencillo
- programa daria el pego en una rutina algo
- mejorada, con texturas y demas... Lo impor-
- tante de este ejemplo es el motor...
-
- *cO
- RECORDAD LAS NORMAS PRINCIPALES DE
- PROGRAMACION GRAFICA:
- *cK
- - No calculeis mas cosas de las que hacen
- falta
- - No hagais 40000 la misma operacion,
- guardadla
- - Podeis intentar hacer tablas de cosenos
- prediseñadas
- - No calculeis todos los poligonos con
- textura, solo los que se ven
- - Coged atajos de programacion
- - Pegadle mucho a vuestro hermano
- - y por ultimo...pero la mas triste:
- en la programacion de demos aun no hay
- lugar para las chicas :_(
-
- *c^
-
- Una vez sabemos representar y modificar
- vertices en el espacio podemos hacer
- muchisimas cosas, asi que os dejo de tiempo
- hasta la proxima Phymosys Magazine para que
- apliqueis estos conceptos basicos...lo que
- viene si que es bueno!:
- - Poligonos, Texturas, Plasma, Pantallas
- Virtuales, archivos graficos,
- efectos, y un sinfin de conceptos que
- aprender.... Nos vemos...
- *cv
- Si alguien tiene interes en intercanviar
- rutinas graficas, codigos fuente,
- utilidades y demas relacionado con la
- demoscene:
- *cj amarfer@alufis34.ffisic.uv.es
- *c^
- Por cierto, os dejo una beta del nuevo
- conversor de imagenes del 3D Studio que
- estoy haciendo...como no esta terminado,
- no incorporo el codigo fuente. Si a
- alguno le interesa, ya sabe mi direccion...
- =============================================
- RECOMIENDO: Sites de Grupos de demoscene...
- por ejemplo BLASTERSOUND, Graph 2.0 y
- "Lenguaje Ensamblador y programacion de
- compatibles" de Prentice Hall ademas de todas
- las NEWS de demoscene.
- PROXIMO: Incorporacion de musica a demos,
- pantallas virtuales y poligonos.
-
- *cG Skynet
-